package Gestor;

import Clases.Bono;
import java.util.ArrayList;
import java.sql.ResultSet;
import java.sql.Date;
import java.sql.SQLException;
import org.hibernate.HibernateException;

public class GestorBono extends GestorBase {

    private static GestorBono instancia = null;
    private static final String BONO_CEDULA = "SP_SELECCIONAR_BONOS_POR_CEDULA";
    private static final String BONO_CODIGO = "SP_SELECCIONAR_BONOS_POR_CODIGO";
    private static final String BONOS_HISTORICOS = "SP_BONOS_HISTORICOS";

    public static GestorBono obtenerInstancia() {
        if (instancia == null) {
            instancia = new GestorBono();
        }
        return instancia;
    }

    private GestorBono() {

    }

    @Override
    public Object insertar(Object bono) {
        boolean exito = false;
        try {
            iniciaOperacion();
            Object bn = sesion.save(bono);
            tx.commit();
            exito = true;
        } catch (HibernateException he) {
            manejaExcepcion(he);
        } finally {
            sesion.close();
        }

        return exito;
    }

    @Override
    public boolean eliminar(Object numeroBono) {
        boolean exito = false;
        try {
            iniciaOperacion();
            int filas = sesion.createSQLQuery("DELETE FROM bono WHERE codigo=:numBono").setParameter("numBono", numeroBono).executeUpdate();
            if (filas >= 1) {
                exito = true;
                tx.commit();
            }
        } catch (HibernateException he) {
            manejaExcepcion(he);

        } finally {
            sesion.close();
        }
        return exito;
    }

    public Bono getBono(int codigo) throws HibernateException {
        Bono bono = null;
        try {
            iniciaOperacion();
            bono = (Bono) sesion.get(Bono.class, codigo);
        } finally {
            sesion.close();
        }

        return bono;
    }

    //devuelve una lista de bonos(con todos los atributos) donde los parametros, son los parametros
    //que se deben pasar al procedimiento almacena
    // y procedimiento es el nombre del procedimiento almacenado
    private ArrayList<Bono> getListaGenericaBonos(String procedimiento, ArrayList<Object> parametros) throws HibernateException {

        ArrayList<Bono> bonos = new ArrayList<>();
        try {
            ResultSet rs = llamarProcedimientoAlmacenado(procedimiento, parametros);
            int maxCols = rs.getMetaData().getColumnCount();
            while (rs.next()) {
                ArrayList<Object> registro = new ArrayList<>(maxCols);
                for (int i = 0; i < maxCols; i++) {
                    registro.add(rs.getObject(i + 1));
                }
                bonos.add(Bono.fromArray(registro));
            }

        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException | SQLException e) {
            System.out.println(e.getMessage());
        } finally {
        }
        return bonos;
    }

    public ArrayList<Bono> getBonosPorCodigo(long codigo, Date fechaPagoInicio, Date fechaPagoFin) throws HibernateException {

        ArrayList<Object> parametros = new ArrayList<>();
        parametros.add(codigo);
        parametros.add(fechaPagoInicio);
        parametros.add(fechaPagoFin);
        return getListaGenericaBonos(BONO_CODIGO, parametros);
    }

    public ArrayList<Bono> getBonosPorCedula(long cedula, Date fechaPagoInicio, Date fechaPagoFin) throws HibernateException {
        ArrayList<Object> parametros = new ArrayList<>();
        parametros.add(cedula);
        parametros.add(fechaPagoInicio);
        parametros.add(fechaPagoFin);
        return getListaGenericaBonos(BONO_CEDULA, parametros);
    }

    public ArrayList<Bono> getBonosPorEmpleadoHistoricos(Long numEmpleado, Date fechaPagoInicio, Date fechaPagoFin) {
        ArrayList<Object> parametros = new ArrayList<>();
        parametros.add(numEmpleado);
        parametros.add(fechaPagoInicio);
        parametros.add(fechaPagoFin);
        return getListaGenericaBonos(BONOS_HISTORICOS, parametros);
    }

}
